package com.cssl.pojo;

//author老二哥儿

import java.lang.reflect.Array;
//稀疏数组
public class SpareArray {

    //压缩成稀疏数组
    public int[][] toSapareArray(int[][] args){
        int rows=args.length; //数组的行数
        int columns=args[0].length; //数组的列数
        int count=0; //记录数组的非零元个数
        for (int i=0;i<rows;i++){
            for (int j = 0; j < columns; j++) {
                if(args[i][j]!=0){
                    count++;
                }
            }
        }
        int Spnum=(count+1)*3; //预计压缩后的数组大小

        if(Spnum>=rows*columns){
            System.out.println("数组压缩后不能起到节省空间的作用，不予压缩！");
            return null;
        }
        int[][] spareArray=new int[count+1][3];
        spareArray[0][0]=rows; //第一行储存的是原数组的行、列数，以及非零元的值；
        spareArray[0][1]=columns;
        spareArray[0][2]=count;
        int p=1;
        for (int i=0;i<rows;i++){
            for (int j = 0; j < columns; j++) {
                if(args[i][j]!=0){
                    spareArray[p][0]=i; //行号
                    spareArray[p][1]=j; //列号
                    spareArray[p][2]=args[i][j]; //非零值
                    p++;
                }
            }
        }
        return spareArray;
    }


    //将稀疏数组解压缩
    public int[][] revertSpareArray(int[][] spArray){
        int rows=spArray[0][0]; //原数组的行数
        int columns=spArray[0][1]; //原数组的列数
        int[][] array=new int[rows][columns];
        for (int i = 1; i < spArray.length; i++) { //取出非零元所在的行、列以及其值，插入解压数组
            int r=spArray[i][0];
            int c=spArray[i][1];
            int val=spArray[i][2];
            array[r][c]=val;
        }
        return  array;
    }

/*    public static void main(String[] args){
        int[][] a=new int[4][6];
        a[3][1]=1;
        a[2][2]=54;
        a[3][2]=54;
        a[1][2]=4;
        a[0][2]=5;
        a[2][0]=4;


        for (int i=0;i<4;i++){
            for (int j = 0; j < 6; j++) {
                System.out.print(a[i][j]+"   ");
            }
            System.out.println();
        }
        SpareArray sa=new SpareArray();
        int[][] ints = sa.toSapareArray(a);
        System.out.println("****************************************************");
        if (ints==null){
            return;
        }
        for (int i=0;i<ints.length;i++){
            for (int j = 0; j < ints[0].length; j++) {
                System.out.print(ints[i][j]+"   ");
            }
            System.out.println();
        }
        System.out.println("****************************************************");
        int[][] ints1 = sa.revertSpareArray(ints);
        for (int i=0;i<ints1.length;i++){
            for (int j = 0; j < ints1[0].length; j++) {
                System.out.print(ints1[i][j]+"   ");
            }
            System.out.println();
        }
    }*/
}
